package com.two.lbms.ww.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.two.lbms.base.BaseService;
import com.two.lbms.dao.ReaderMapper;
import com.two.lbms.utils.AssertUtil;
import com.two.lbms.utils.PhoneUtil;
import com.two.lbms.vo.Reader;
import com.two.lbms.ww.query.ReaderInfo;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.*;

@Service
public class ReaderService extends BaseService<Reader,Integer> {
    @Resource
    private ReaderMapper readerMapper;

    /**
     *  多条件分页查询读者信息
     * @param readerInfo
     * @return
     */
    public Map<String,Object> queryReaderAllByReader(ReaderInfo readerInfo){
        Map<String,Object> map = new HashMap<>();
        // 开启分页
        PageHelper.startPage(readerInfo.getPage(),readerInfo.getLimit());
        // 得到对应的分页对象
        PageInfo<Reader> pageInfo = new PageInfo<>(readerMapper.selectByParams(readerInfo));
        // 设置map对象
        map.put("code",0);
        map.put("msg","success");
        map.put("count",pageInfo.getTotal());
        // 设置分页好的列表
        map.put("data",pageInfo.getList());
        // 返回
        return map;
    }


    /**
     * 添加读者
     *
     * @param reader
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void addReader(Reader reader){
        //System.out.println(reader);
        // 1、参数校验
        checkReaderParams(reader.getReaderName(),reader.getSex(),reader.getPhone(),reader.getAddress(),reader.getIdCard());
        // 2、设置相关的默认值
        // 是否有效 ，设置为有效  0=无效   1=有效
        reader.setIsValid(1);
        //违规次数  默认0
        reader.setViolationTimes(0);
        // 注册时间
        reader.setRegisterDate(LocalDateTime.now());
        // 更新时间
        reader.setUpdateTime(LocalDateTime.now());
        // 会员类型
        // reader.setReaderType(reader.getReaderType());
        // 3、执行添加操作，判断受影响的行数
        AssertUtil.isTrue(readerMapper.insertSelective(reader)<1,"添加失败！");

    }


    /**
     * 读者添加的参数校验
     * @param readerName
     * @param sex
     * @param phone
     * @param address
     * @param idCard
     */
    private void checkReaderParams(String readerName, String sex, String phone, String address, String idCard) {
        // 读者姓名   非空
        AssertUtil.isTrue(StringUtils.isBlank(readerName),"读者姓名不能为空！");
        // 读者性别  非空
        AssertUtil.isTrue(StringUtils.isBlank(sex),"必填项不能为空！");
        // 手机号    非空 且格式要正确
        AssertUtil.isTrue(StringUtils.isBlank(phone),"手机号不能为空！");
        // 手机号格式判断
        AssertUtil.isTrue(!PhoneUtil.isMobile(phone),"手机号格式不正确！");
        // 家庭地址   非空
        AssertUtil.isTrue(StringUtils.isBlank(address),"家庭地址不能为空！");
        // 身份证号不能为空
        AssertUtil.isTrue(StringUtils.isBlank(idCard),"身份证号不能为空！");
    }


    /**
     * 读者信息更新
     *
     * @param reader
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateReader(Reader reader){
        // 读者Id存在  非空，即数据库中存在相对应的读者信息
        AssertUtil.isTrue(null == reader.getId(),"不存在此读者信息！");
        // 通过读者Id查询读者对象
        Reader temp = readerMapper.selectByPrimaryKey(reader.getId());
        // 判断是否有此读者信息
        AssertUtil.isTrue(null == temp,"无此读者信息！");
        // 参数校验 ，同 添加 一样
        checkReaderParams(reader.getReaderName(),reader.getSex(),reader.getPhone(),reader.getAddress(),reader.getIdCard());

        // 设置相关默认值
        reader.setUpdateTime(LocalDateTime.now());

        // 执行更新操作，判断受影响的行数
        AssertUtil.isTrue(readerMapper.updateByPrimaryKeySelective(reader)<1,"读者信息更新失败！");

    }


    /**
     *  删除读者信息
     * @param ids
     */
    public void deleteReader(Integer[] ids){
        // 判断id是否为空
        AssertUtil.isTrue(null == ids || ids.length < 1,"请选择要删除的读者用户！");
        // 执行删除操作（更新）  判断受影响的行数
        AssertUtil.isTrue(readerMapper.deleteBatch(ids)!=ids.length,"删除读者信息失败！");

    }


    /**
     * 根据id查询读者信息
     * @param readerId
     * @return
     */
    public Reader queryReaderById(Integer readerId) {
        // 判断id是否为空
        AssertUtil.isTrue(null == readerId,"未选中读者Id！");

        return readerMapper.selectByPrimaryKey(readerId);
    }
}
